#include "../include/deng.h"

void deng() // 验证账号
{
    system("clear");
    char id1[40];                       // 账号
    char pos1[20];                      // 密码
    char hua[] = "错误超过3次，请等待"; // 插入话语
    int flag_1 = 0;
    int num = 0; // 用于记录输入错误的次数
    /*
    flag_1 = -98  账号正确
    */
    Link_list *L = nacun(); // 把文件里面的东西放在链表里面
    while (1)
    {
        puts("请输入你的账号");
        getchar();
        scanf("%s", id1);
        puts("请输入你的密码");
        getchar();
        scanf("%s", pos1);
        Node *ptr = L->next;
        for (size_t i = 0; ptr != NULL; i++) // 循环比较
        {
            if (strcmp(ptr->data.id, id1) == 0 && strcmp(ptr->data.pos, pos1) == 0)
            {
                flag_1 = -98;
                break;
            }
            ptr = ptr->next; // 往后移
        }
        if (flag_1 == -98)
        {
            system("clear");
            printf("登录成功！\n");
            if (strcmp(ptr->data.userType, "root") == 0)
            {
                root(); // root用户
            }
            else
            {
                user(ptr); // user用户
            }

            break;
        }
        else
        {
            printf("账号或密码错误，请重新输入...\n");
            num++;
        }

        if (num == 3)
        {
            int fl = 0;
            num = 0;                      // 错误次数请0
            deng_jindutiao(0, 0, 5, hua); // 打印进度条
            printf("是否继续登录\n");     // 可退出
            puts("1:继续登录\t\t2:退出登录");

            while (1)
            {
                scanf("%d", &fl);
                if (fl == 1)
                {
                    printf("继续\n");
                    break;
                }
                else if (fl == 2)
                {
                    printf("感谢使用！\n");
                    return;
                }
                else
                {
                    printf("输入有误，请重新输入：\n");
                    while (getchar() != '\n')
                        ;
                    continue;
                }
            }
        }
    }
    free_link_list(&L);
    return;
}

/*
用户名 Progress_yBar
参数
    @x              想要显示的位置 x
    @y              想要显示的位置 y
    @time_length    想要延时的时间
返回值
    无
功能
    进度条功能
*/
void deng_jindutiao(int x, int y, float time_length, char a[]) // 进度条
{
    float flag = 0;                          // 当前进度时间
    float total_length = 20;                 // 进度条总长度
    float mean = time_length / total_length; // 平均数
    float temp = 0;                          // 和平均数对比
    float percent = 0;                       // 用于显示百分比
    int num = 0;                             // 控制进度条符号的个数

    while (1)
    {

        if (fabs(temp - mean) < EPSILON) // 使用fabs计算浮点数差值的绝对值
        {
            num++;
            temp = 0;
        }
        for (size_t i = 0; i < y; i++)
        {
            putchar('\n');
        }
        for (size_t i = 0; i < x; i++)
        {
            putchar(' ');
        }

        putchar('[');
        for (size_t i = 0; i < num; i++)
        {
            printf(">");
        }
        for (size_t i = 0; i < total_length - num; i++)
        {
            printf(" ");
        }
        putchar(']');
        percent = (flag / time_length) * 100; // 计算百分比
        printf("%.2f%%\n", percent);
        // 控制提示信息的横向位置
        for (size_t i = 0; i < x; i++)
        {
            putchar(' ');
        }
        printf("%s", a);
        printf(" %.1f 秒\n", time_length);
        temp += 0.01;
        flag += 0.01;
        if (fabs(flag - time_length) < EPSILON)
        {
            break;
        }

        fflush(stdout);
        usleep(10000);
        system("clear");
    }
    system("clear");
}

void kai() // 开始界面
{
    int i;
    printf("欢迎来到登录系统\n");
    while (1)
    {
        printf("=============================\n");
        printf("1. 登陆\n");
        printf("2. 注册\n");
        printf("3. 退出\n");
        printf("=============================\n");
        printf("请选择：\n");
        while (1)
        {
            scanf("%d", &i);
            if (i == 1 || i == 2 || i == 3)
            {
                break;
            }
            else
            {
                printf("输入有误，请重新输入：\n");
                while (getchar() != '\n')
                    ;
                continue;
            }
        }
        system("clear");
        switch (i)
        {
        case 1:
            deng();
            break;
        case 2:
            zhuce();
            break;
        case 3:
            printf("欢迎使用！\n");
            return;
        default:
            return;
        }
    }
    return;
}

void kai_xuan(int i) // 开始界面选择
{
}

// 打开文件
FILE *file_open(const char *path, const char *mode)
{
    FILE *fp = fopen(path, mode);
    if (NULL == fp)
    {
        printf("文件创建失败\n");
        exit(-1);
    }
    return fp;
}

// 关闭文件
int file_close(FILE **fp)
{
    fclose(*fp);
    *fp = NULL;
}

// 把文件里面的东西拿出来(名单)
Link_list *nacun()
{
    FILE *fp = file_open("花名册.txt", "r");
    fseek(fp, 0, SEEK_SET);
    Link_list *L = init_link_list();
    Node *new = (Node *)malloc(sizeof(Node)); // 建立一个新的空间去存储数据
    int i = 1;
    while ((fscanf(fp, "%[^;];%[^;];%[^;];%[^;];%d;%d\n", new->data.userType, new->data.id, new->data.pos, new->data.name, &new->data.value, &new->data.vip)) != -1)
    {
        insert_node(L, new->data, i);
        i++;
    }
    file_close(&fp);
    // 从航班记录拿成员的购票记录出来
    FILE *fp_1 = file_open("航班记录.txt", "r");
    Node *p = L->next;
    while ((fscanf(fp_1, "%[^;];%s\n", new->data.name, new->data.a.data->name)) != -1) // 从航班记录能拿出数据
    {
        while (1)
        {
            if (strcmp(p->data.name, new->data.name) == 0) // 对比链表的名字和新空间里面的名字
            {
                strcpy(p->data.a.data[p->data.a.len].name, new->data.a.data->name); // 如果一样则在用户的顺序表里去存航班信息
                p->data.a.len++;                                                    // 顺序表长度加一
                break;                                                              // 跳出死循环继续进行
            }
            else
            {
                p = p->next; // 用户名不匹配则后移继续寻找用户
            }
        }
    }

    file_close(&fp_1);
    free(new); // 释放新节点
    new = NULL;
    return L;
}

// 把文件里面的东西拿出来(航班)
Link_hang *nacun_hang()
{
    FILE *fp_1 = file_open("航班信息.txt", "r");
    Link_hang *L = init_link_hang();
    hang *new_1 = (hang *)malloc(sizeof(hang)); // 建立一个新的空间去存储数据
    int i = 1;
    while ((fscanf(fp_1, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%d;%d;%d;%c\n",
                   new_1->data.number, new_1->data.staddress, new_1->data.arraddress, new_1->data.DATE,
                   new_1->data.TYPE, new_1->data.stime, new_1->data.atime, &new_1->data.value,
                   &new_1->data.maxNUM, &new_1->data.leftbuyersa, &new_1->data.whetherfly)) != -1)
    {
        insert_hang(L, new_1->data, i);
        i++;
    }
    free(new_1);
    file_close(&fp_1);
    return L;
}

// 查看成员的所购票在什么位置
int jilu_wei(Sql_list o, char *s)
{
    int i = 0;
    for (i = 0; i < o.len; i++)
    {
        if (strcmp(o.data[i].name, s) == 0)
        {
            return i;
        }
    }
}

// 等待函数
void pause_and_continue()
{
    while (getchar() != '\n')
        ;
    printf("按下Enter键继续...\n");
    getchar(); // 等待用户按下任意键
}
